#include "at32f415_usart_driver.h"

void at32f415_usart_configure(USART_CONF *usart_conf)
{
    gpio_init_type gpio_init_struct;

    /* enable the usartx and gpio clock */
    crm_periph_clock_enable(usart_conf->usart_crm_clk_type, TRUE);  
    crm_periph_clock_enable(usart_conf->gpio_crm_clk_type, TRUE);   

    gpio_default_para_init(&gpio_init_struct);

    /* configure the usartx tx pin */
    gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
    gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
    gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
    gpio_init_struct.gpio_pins = usart_conf->gpio_pins_tx;
    gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
    gpio_init(usart_conf->gpio_x, &gpio_init_struct);

    /* configure the usartx rx pin */
    gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
    gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
    gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
    gpio_init_struct.gpio_pins = usart_conf->gpio_pins_rx;
    gpio_init_struct.gpio_pull = GPIO_PULL_UP;
    gpio_init(usart_conf->gpio_x, &gpio_init_struct);

    /* config usart nvic interrupt */
    //nvic_priority_group_config(usart_conf->priority_group);
    nvic_irq_enable(usart_conf->irqn, usart_conf->preempt_priority, usart_conf->sub_priority);

    /* configure usart2 param */
    usart_init(usart_conf->usart_x, usart_conf->baud_rate,usart_conf->data_bit, usart_conf->stop_bit);
    usart_transmitter_enable(usart_conf->usart_x, TRUE);
    usart_receiver_enable(usart_conf->usart_x, TRUE);

    //usart_flag_clear(usart_conf->usart_x,USART_RDBF_FLAG);
    //usart_flag_clear(usart_conf->usart_x,USART_ROERR_FLAG);
    usart_interrupt_enable(usart_conf->usart_x, USART_RDBF_INT, TRUE);
    usart_interrupt_enable(usart_conf->usart_x, USART_TDC_INT, TRUE);  
    usart_enable(usart_conf->usart_x, TRUE);
    usart_flag_clear(usart_conf->usart_x,USART_TDBE_FLAG);
    
    //usart_interrupt_enable(usart_conf->usart_x, USART_TDBE_INT, TRUE);  
}

void rs485_receive_diable(USART_CONF *usart_conf)
{
    usart_interrupt_enable(usart_conf->usart_x, USART_RDBF_INT, FALSE);
}

void rs485_receive_enable(USART_CONF *usart_conf)
{
    usart_interrupt_enable(usart_conf->usart_x, USART_RDBF_INT, TRUE);
}
